<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>src/utils/util.global.js - sceneGraph.js</title>
    <link rel="stylesheet" href="http://yui.yahooapis.com/3.9.1/build/cssgrids/cssgrids-min.css">
    <link rel="stylesheet" href="../assets/vendor/prettify/prettify-min.css">
    <link rel="stylesheet" href="../assets/css/main.css" id="site_styles">
    <link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
    <script src="http://yui.yahooapis.com/combo?3.9.1/build/yui/yui-min.js"></script>
</head>
<body class="yui3-skin-sam">

<div id="doc">
    <div id="hd" class="yui3-g header">
        <div class="yui3-u-3-4">
            
                <h1><img src="../../logo/logoCGSG_256x57.png" title="sceneGraph.js"></h1>
            
        </div>
        <div class="yui3-u-1-4 version">
            <em>API Docs for: v2.1.0</em>
        </div>
    </div>
    <div id="bd" class="yui3-g">

        <div class="yui3-u-1-4">
            <div id="docs-sidebar" class="sidebar apidocs">
                <div id="api-list">
    <h2 class="off-left">APIs</h2>
    <div id="api-tabview" class="tabview">
        <ul class="tabs">
            <li><a href="#api-classes">Classes</a></li>
            <li><a href="#api-modules">Modules</a></li>
        </ul>

        <div id="api-tabview-filter">
            <input type="search" id="api-filter" placeholder="Type to filter APIs">
        </div>

        <div id="api-tabview-panel">
            <ul id="api-classes" class="apis classes">
            
                <li><a href="../classes/CGSG.html">CGSG</a></li>
            
                <li><a href="../classes/CGSGAccordion.html">CGSGAccordion</a></li>
            
                <li><a href="../classes/CGSGAnimationManager.html">CGSGAnimationManager</a></li>
            
                <li><a href="../classes/CGSGAnimationMethod.html">CGSGAnimationMethod</a></li>
            
                <li><a href="../classes/CGSGBindEntry.html">CGSGBindEntry</a></li>
            
                <li><a href="../classes/CGSGButtonMode.html">CGSGButtonMode</a></li>
            
                <li><a href="../classes/CGSGCollisionGhostOnDemandTester.html">CGSGCollisionGhostOnDemandTester</a></li>
            
                <li><a href="../classes/CGSGCollisionManager.html">CGSGCollisionManager</a></li>
            
                <li><a href="../classes/CGSGCollisionMethod.html">CGSGCollisionMethod</a></li>
            
                <li><a href="../classes/CGSGCollisionRegionTester.html">CGSGCollisionRegionTester</a></li>
            
                <li><a href="../classes/CGSGCollisionTesterFactory.html">CGSGCollisionTesterFactory</a></li>
            
                <li><a href="../classes/CGSGColor.html">CGSGColor</a></li>
            
                <li><a href="../classes/CGSGCSSManager.html">CGSGCSSManager</a></li>
            
                <li><a href="../classes/CGSGDimension.html">CGSGDimension</a></li>
            
                <li><a href="../classes/CGSGEvent.html">CGSGEvent</a></li>
            
                <li><a href="../classes/CGSGEventManager.html">CGSGEventManager</a></li>
            
                <li><a href="../classes/CGSGHandleBox.html">CGSGHandleBox</a></li>
            
                <li><a href="../classes/CGSGImgManager.html">CGSGImgManager</a></li>
            
                <li><a href="../classes/CGSGInterpolator.html">CGSGInterpolator</a></li>
            
                <li><a href="../classes/CGSGInterpolatorLinear.html">CGSGInterpolatorLinear</a></li>
            
                <li><a href="../classes/CGSGInterpolatorTCB.html">CGSGInterpolatorTCB</a></li>
            
                <li><a href="../classes/CGSGKeyFrame.html">CGSGKeyFrame</a></li>
            
                <li><a href="../classes/CGSGMap.html">CGSGMap</a></li>
            
                <li><a href="../classes/CGSGMask.html">CGSGMask</a></li>
            
                <li><a href="../classes/CGSGMaskCache.html">CGSGMaskCache</a></li>
            
                <li><a href="../classes/CGSGMaskClip.html">CGSGMaskClip</a></li>
            
                <li><a href="../classes/CGSGMath.html">CGSGMath</a></li>
            
                <li><a href="../classes/CGSGNode.html">CGSGNode</a></li>
            
                <li><a href="../classes/CGSGNodeButton.html">CGSGNodeButton</a></li>
            
                <li><a href="../classes/CGSGNodeCircle.html">CGSGNodeCircle</a></li>
            
                <li><a href="../classes/CGSGNodeColorPicker.html">CGSGNodeColorPicker</a></li>
            
                <li><a href="../classes/CGSGNodeCurveTCB.html">CGSGNodeCurveTCB</a></li>
            
                <li><a href="../classes/CGSGNodeDomElement.html">CGSGNodeDomElement</a></li>
            
                <li><a href="../classes/CGSGNodeEllipse.html">CGSGNodeEllipse</a></li>
            
                <li><a href="../classes/CGSGNodeImage.html">CGSGNodeImage</a></li>
            
                <li><a href="../classes/CGSGNodeLine.html">CGSGNodeLine</a></li>
            
                <li><a href="../classes/CGSGNodeSlider.html">CGSGNodeSlider</a></li>
            
                <li><a href="../classes/CGSGNodeSliderHandle.html">CGSGNodeSliderHandle</a></li>
            
                <li><a href="../classes/CGSGNodeSprite.html">CGSGNodeSprite</a></li>
            
                <li><a href="../classes/CGSGNodeSquare.html">CGSGNodeSquare</a></li>
            
                <li><a href="../classes/CGSGNodeTabMenu.html">CGSGNodeTabMenu</a></li>
            
                <li><a href="../classes/CGSGNodeText.html">CGSGNodeText</a></li>
            
                <li><a href="../classes/CGSGNodeWebview.html">CGSGNodeWebview</a></li>
            
                <li><a href="../classes/CGSGParticle.html">CGSGParticle</a></li>
            
                <li><a href="../classes/CGSGParticleEmitter.html">CGSGParticleEmitter</a></li>
            
                <li><a href="../classes/CGSGParticleSystem.html">CGSGParticleSystem</a></li>
            
                <li><a href="../classes/CGSGPickNodeMethod.html">CGSGPickNodeMethod</a></li>
            
                <li><a href="../classes/CGSGPosition.html">CGSGPosition</a></li>
            
                <li><a href="../classes/CGSGRegion.html">CGSGRegion</a></li>
            
                <li><a href="../classes/CGSGRotation.html">CGSGRotation</a></li>
            
                <li><a href="../classes/CGSGScale.html">CGSGScale</a></li>
            
                <li><a href="../classes/CGSGSceneGraph.html">CGSGSceneGraph</a></li>
            
                <li><a href="../classes/CGSGSection.html">CGSGSection</a></li>
            
                <li><a href="../classes/CGSGTimeline.html">CGSGTimeline</a></li>
            
                <li><a href="../classes/CGSGTraverser.html">CGSGTraverser</a></li>
            
                <li><a href="../classes/CGSGVector2D.html">CGSGVector2D</a></li>
            
                <li><a href="../classes/CGSGView.html">CGSGView</a></li>
            
                <li><a href="../classes/CGSGWEBVIEWMODE.html">CGSGWEBVIEWMODE</a></li>
            
                <li><a href="../classes/CGSGWrapMode.html">CGSGWrapMode</a></li>
            
                <li><a href="../classes/GLOBAL_CONSTANTS.html">GLOBAL_CONSTANTS</a></li>
            
                <li><a href="../classes/GLOBAL_METHODS.html">GLOBAL_METHODS</a></li>
            
                <li><a href="../classes/GLOBAL_PROPERTIES.html">GLOBAL_PROPERTIES</a></li>
            
                <li><a href="../classes/UTIL_ARRAY.html">UTIL_ARRAY</a></li>
            
                <li><a href="../classes/WUICCGSGNodeImageFactory.html">WUICCGSGNodeImageFactory</a></li>
            
            </ul>

            <ul id="api-modules" class="apis modules">
            
                <li><a href="../modules/Animation.html">Animation</a></li>
            
                <li><a href="../modules/Collision.html">Collision</a></li>
            
                <li><a href="../modules/Math.html">Math</a></li>
            
                <li><a href="../modules/Node.html">Node</a></li>
            
                <li><a href="../modules/ParticleSystem.html">ParticleSystem</a></li>
            
                <li><a href="../modules/Scene.html">Scene</a></li>
            
                <li><a href="../modules/Util.html">Util</a></li>
            
            </ul>
        </div>
    </div>
</div>

            </div>
        </div>
        <div class="yui3-u-3-4">
                <div id="api-options">
        Show:
        <label for="api-show-inherited">
            <input type="checkbox" id="api-show-inherited" checked>
            Inherited
        </label>

        <label for="api-show-protected">
            <input type="checkbox" id="api-show-protected">
            Protected
        </label>

        <label for="api-show-private">
            <input type="checkbox" id="api-show-private">
            Private
        </label>
        <label for="api-show-deprecated">
            <input type="checkbox" id="api-show-deprecated">
            Deprecated
        </label>

    </div>


            <div class="apidocs">
                <div id="docs-main">
                    <div class="content">
                        <h1 class="file-heading">File: src/utils/util.global.js</h1>

<div class="file">
    <pre class="code prettyprint linenums">
/*
 * Copyright (c) 2014 Gwennael Buchet
 *
 * License/Terms of Use
 *
 * Permission is hereby granted, free of charge and for the term of intellectual property rights on the Software, to any
 * person obtaining a copy of this software and associated documentation files (the &quot;Software&quot;), to use, copy, modify
 * and propagate free of charge, anywhere in the world, all or part of the Software subject to the following mandatory conditions:
 *
 *   •    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 *
 *  Any failure to comply with the above shall automatically terminate the license and be construed as a breach of these
 *  Terms of Use causing significant harm to Gwennael Buchet.
 *
 *  THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
 *  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
 *  OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 *  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 *  Except as contained in this notice, the name of Gwennael Buchet shall not be used in advertising or otherwise to promote
 *  the use or other dealings in this Software without prior written authorization from Gwennael Buchet.
 *
 *  These Terms of Use are subject to French law.
 */

/**
 * Global methods
 *
 * @class GLOBAL_METHODS
 * @module Util
 * @static
 * @author Gwennael Buchet (gwennael.buchet@gmail.com)
 */

/**
 * @method cgsgExist
 * @param o {Object}
 * @return {boolean} true if the parameter !== null &amp;&amp; !== undefined &amp;&amp; (!isNaN(o) &amp;&amp; isFinite(o))
 */
function cgsgExist(o) {
    if (typeof o === &#x27;number&#x27;) {
        return !isNaN(o) &amp;&amp; isFinite(o);
    }

    return (o !== null &amp;&amp; o !== undefined);
}

/**
 * @method cgsgDetectCurrentExplorer
 */
function cgsgDetectCurrentExplorer() {
    //noinspection JSUndeclaredVariable
    cgsgCurrentExplorer = cgsgExplorerParams.UNKNOWN;

    var userAgent = navigator.userAgent;
    var browserName = navigator.appName;
    var fullVersion = &#x27;&#x27; + parseFloat(navigator.appVersion);
    var nameOffset, versionOffset;

    if ((versionOffset = userAgent.indexOf(&quot;Opera&quot;)) !== -1) {
        //noinspection JSUndeclaredVariable
        cgsgCurrentExplorer = cgsgExplorerParams.OPERA;
        fullVersion = userAgent.substring(versionOffset + 6);
        if ((versionOffset = userAgent.indexOf(&quot;Version&quot;)) !== -1) {
            fullVersion = userAgent.substring(versionOffset + 8);
        }
    }
    else if ((versionOffset = userAgent.indexOf(&quot;MSIE&quot;)) !== -1) {
        browserName = &quot;Microsoft Internet Explorer&quot;;
        //noinspection JSUndeclaredVariable
        cgsgCurrentExplorer = cgsgExplorerParams.IE9;
        fullVersion = userAgent.substring(versionOffset + 5);
        if (parseInt(fullVersion) &gt;= 10) {
            //noinspection JSUndeclaredVariable
            cgsgCurrentExplorer = cgsgExplorerParams.IE10;
        }
    }
    else if ((versionOffset = userAgent.indexOf(&quot;Chrome&quot;)) !== -1) {
        //noinspection JSUndeclaredVariable
        cgsgCurrentExplorer = cgsgExplorerParams.CHROME;
        fullVersion = userAgent.substring(versionOffset + 7);
    }
    else if ((versionOffset = userAgent.indexOf(&quot;Safari&quot;)) !== -1) {
        //noinspection JSUndeclaredVariable
        cgsgCurrentExplorer = cgsgExplorerParams.SAFARI;
        fullVersion = userAgent.substring(versionOffset + 7);
        if ((versionOffset = userAgent.indexOf(&quot;Version&quot;)) !== -1) {
            fullVersion = userAgent.substring(versionOffset + 8);
        }
    }
    else if ((versionOffset = userAgent.indexOf(&quot;Firefox&quot;)) !== -1) {
        //noinspection JSUndeclaredVariable
        cgsgCurrentExplorer = cgsgExplorerParams.FIREFOX;
        fullVersion = userAgent.substring(versionOffset + 8);
    }
    else if ((nameOffset = userAgent.lastIndexOf(&#x27; &#x27;) + 1) &lt;
             (versionOffset = userAgent.lastIndexOf(&#x27;/&#x27;))) {
        browserName = userAgent.substring(nameOffset, versionOffset);
        fullVersion = userAgent.substring(versionOffset + 1);
        if (browserName.toLowerCase() == browserName.toUpperCase()) {
            browserName = navigator.appName;
        }
    }

    cgsgCurrentExplorer.fullVersion = fullVersion;
    cgsgCurrentExplorer.browserName = browserName;

    //Now, check for support for webworker
    cgsgCurrentExplorer.webworker = typeof(Worker) !== &quot;undefined&quot;;
}

var cgsgStylePaddingLeft = 0;
var cgsgStylePaddingTop = 0;
var cgsgStyleBorderLeft = 0;
var cgsgStyleBorderTop = 0;

/**
 * @method cgsgGetRealViewportDimension
 * @return {CGSGDimension} a CGSGDimension as the real viewport dimension
 */
function cgsgGetRealViewportDimension() {
    var e = window, a = &#x27;inner&#x27;;
    if (!( &#x27;innerWidth&#x27; in window )) {
        a = &#x27;client&#x27;;
        e = document.documentElement || document.body;
    }
    return new CGSGDimension(e[a + &#x27;Width&#x27;], e[a + &#x27;Height&#x27;]);
}

/**
 * @method cgsgGetDisplayedViewportDimension
 * @return {CGSGDimension} a CGSGDimension as the viewport region
 */
function cgsgGetDisplayedViewportDimension() {
    var realDim = cgsgGetRealViewportDimension();
    return new CGSGDimension(Math.round(realDim.width / CGSG.displayRatio.x),
                             Math.round(realDim.height / CGSG.displayRatio.y));
}

/**
 * @method cgsgPointIsInRegion
 * @return {Boolean} true if the point is inside the region or around this one in a distance of threshold
 * @param point a CGSGPosition
 * @param targetRegion a CGSGRegion
 * @param threshold an integer
 */
function cgsgPointIsInRegion(point, targetRegion, threshold) {
    return point.x &gt;= (targetRegion.position.x - threshold) &amp;&amp;
           point.y &gt;= (targetRegion.position.y - threshold) &amp;&amp;
           point.x &lt;= (targetRegion.position.x + targetRegion.dimension.width + threshold) &amp;&amp;
           point.y &lt;= (targetRegion.position.y + targetRegion.dimension.height + threshold);
}

/**
 * @method cgsgRegionIsInRegion
 * @return {Boolean} true if the point is inside the region or around this one in a distance of threshold
 * @param region a CGSGRegion
 * @param targetRegion a CGSGRegion
 * @param threshold an integer
 */
function cgsgRegionIsInRegion(region, targetRegion, threshold) {
    return region.position.x &gt;= (targetRegion.position.x - threshold) &amp;&amp;
           region.position.y &gt;= (targetRegion.position.y - threshold) &amp;&amp;
           (region.position.x + region.dimension.width) &lt;=
           (targetRegion.position.x + targetRegion.dimension.width + threshold) &amp;&amp;
           (region.position.y + region.dimension.height) &lt;=
           (targetRegion.position.y + targetRegion.dimension.height + threshold);
}

/**
 * Return the mouse or touch positions relative to the canvas
 * @method cgsgGetCursorPositions
 * @param {Event} event a touch or mouse Event
 * @param {HTMLElement} canvas a handler to the Canvas element
 * @return {Array} Array of CGSGPosition object
 */
function cgsgGetCursorPositions(event, canvas) {
    var element = canvas, offsetX = 0, offsetY = 0, positions = [];

    if (element.offsetParent) {
        do {
            offsetX += element.offsetLeft;
            offsetY += element.offsetTop;
        } while ((element = element.offsetParent));
    }

    // Add padding and border style widths to offset
    offsetX += cgsgStylePaddingLeft;
    offsetY += cgsgStylePaddingTop;

    offsetX += cgsgStyleBorderLeft;
    offsetY += cgsgStyleBorderTop;

    var touch = event;
    //if multi-touch, get all the positions
    if (event.targetTouches) { // or changedTouches
        var touchPoints = (typeof event.targetTouches !== &#x27;undefined&#x27;) ? event.targetTouches : [event];
        for (var i = 0; i &lt; touchPoints.length; i++) {
            touch = touchPoints[i];

            positions.push(new CGSGPosition((touch.pageX - offsetX) / CGSG.displayRatio.x,
                                            (touch.pageY - offsetY) / CGSG.displayRatio.y));
        }
    }
    else {
        positions.push(new CGSGPosition((touch.pageX - offsetX) / CGSG.displayRatio.x,
                                        (touch.pageY - offsetY) / CGSG.displayRatio.y));
    }

    return positions;
}

/**
 * Wipes the canvas context
 * @method cgsgClearContext
 * @param {CanvasRenderingContext2D} context context to render on
 * */
function cgsgClearContext(context) {
    context.setTransform(1, 0, 0, 1, 0, 0);
    // Will always clear the right space
    context.clearRect(0, 0, CGSG.canvas.width, CGSG.canvas.height);
}

/**
 * Iterates the given array and, at each iteration, calls the given callback function. The loop stops if the callback
 * function returns false.
 *
 * Optimized loop is used here and should be prefer to other approaches, especially on old browser versions and IE.
 *
 * @method cgsgIterate
 * @param array {Array} the array
 * @param callback {Function} the callback
 */
function cgsgIterate(array, callback) {
    var i = 0, len = array.length;

    for (; i &lt; len &amp;&amp; callback(i, array[i++]) !== false;) {
    }
}

/**
 * Iterates the given array from the end to the beginning of the array. The loop stops if the callback function returns
 * false.
 *
 * Prefer to use this method for the same reasons than cgsgIterate.
 *
 * @method cgsgIterateReverse
 * @param array {Array} the array
 * @param callback {Function} the callback
 */
function cgsgIterateReverse(array, callback) {
    var i = array.length - 1;

    for (; i &gt;= 0 &amp;&amp; callback(i, array[i--]) !== false;) {
    }
}

/**
 * Free the given object and notify listeners with appropriate event.
 *
 * @method cgsgFree
 * @param {*} object
 */
function cgsgFree(object) {
    if (cgsgExist(object.onFreeEvent)) {
        CGSG.eventManager.dispatch(object, cgsgEventTypes.ON_FREE, new CGSGEvent(this, null));
    }
    object = null;
}
    </pre>
</div>

                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="../assets/vendor/prettify/prettify-min.js"></script>
<script>prettyPrint();</script>
<script src="../assets/js/yui-prettify.js"></script>
<script src="../assets/../api.js"></script>
<script src="../assets/js/api-filter.js"></script>
<script src="../assets/js/api-list.js"></script>
<script src="../assets/js/api-search.js"></script>
<script src="../assets/js/apidocs.js"></script>
</body>
</html>
